{
  stdenv,
  lib,
  dict,
  libfaketime,
}:
(
  {
    dictlist,
    allowList ? [ "127.0.0.1" ],
    denyList ? [ ],
  }:

  /*
    dictlist is a list of form
    [ { filename = /path/to/files/basename;
    name = "name"; } ]
    basename.dict.dz and basename.index should be
    dict files. Or look below for other options.
    allowList is a list of IP/domain *-wildcarded strings
    denyList is the same..
  */

  let
    link_arguments = map (x: ''"${x.filename}" '') dictlist;
    databases = lib.concatStrings (map (x: "${x.name}  ${x.filename}\n") dictlist);
    allow = lib.concatStrings (map (x: "allow ${x}\n") allowList);
    deny = lib.concatStrings (map (x: "deny ${x}\n") denyList);
    accessSection = "
  access {
    ${allow}
    ${deny}
  }
";
    installPhase = ''
        mkdir -p $out/share/dictd
      cd $out/share/dictd
      echo "${databases}" >databases.names
      echo "${accessSection}" > dictd.conf
      for j in ${toString link_arguments}; do
        name="$(egrep '  '"$j"\$ databases.names)"
        name=''${name%  $j}
        if test -d "$j"; then
          if test -d "$j"/share/dictd ; then
            echo "Got store path $j"
            j="$j"/share/dictd
          fi
          echo "Directory reference: $j"
          i=$(ls "$j""/"*.index)
          i="''${i%.index}";
        else
          i="$j";
        fi
        echo "Basename is $i"
        locale=$(cat "$(dirname "$i")"/locale)
        base="$(basename "$i")"
        echo "Locale is $locale"
        export LC_ALL=$locale
        export LANG=$locale
        if test -e "$i".dict.dz; then
          ln -s "$i".dict.dz
        else
          cp "$i".dict .
          source_date=$(date --utc --date=@$SOURCE_DATE_EPOCH "+%F %T")
          faketime -f "$source_date" dictzip "$base".dict
        fi
        ln -s "$i".index .
        dictfmt_index2word --locale $locale < "$base".index > "$base".word || true
        dictfmt_index2suffix --locale $locale < "$base".index > "$base".suffix || true

        echo "database $name {" >> dictd.conf
        echo "  data $out/share/dictd/$base.dict.dz" >> dictd.conf
        echo "  index $out/share/dictd/$base.index" >> dictd.conf
        echo "  index_word $out/share/dictd/$base.word" >> dictd.conf
        echo "  index_suffix $out/share/dictd/$base.suffix" >> dictd.conf
        echo "}" >> dictd.conf
      done
    '';

  in

  stdenv.mkDerivation {
    name = "dictd-dbs";

    nativeBuildInputs = [ libfaketime ];
    buildInputs = [ dict ];

    dontUnpack = true;
    inherit installPhase;
  }
)
